// package main
// import(
// 	"fmt"
// 	"sync"
// 	"time"
// )
// var wg sync.WaitGroup
// func putNum(ch chan <-int){
// 	defer wg.Done()
// 	for i:=1;i<=10;i++{
// 		ch<-i
// 		fmt.Printf("放入%d\n",i)
// 		time.Sleep(time.Millisecond*100)
// 	}
// 	close(ch)
// }
// func printNum(ch <-chan int){
// 	defer wg.Done()
// 	for val:=range ch{
// 		fmt.Printf("val=%d\n",val)
// 		time.Sleep(time.Millisecond*100)
// 	}
// }
// func main(){
// 	ch:=make(chan int,10)
// 	ch<-10
// 	ch<-20
// 	m1:=<-ch
// 	m2:=<-ch
// 	fmt.Println(m1,m2)
// 	ch1:=make(chan <-int,10)
// 	ch1<-90
// 	ch1<-80
// 	//m3:=<-ch1
// 	//ch2:=make(<-chan int,10)
// 	//ch2<-999
// 	channel:=make(chan int,10)
// 	wg.Add(1)
// 	go putNum(channel)
// 	wg.Add(1)
// 	go printNum(channel)
// 	wg.Wait()
// }

// package main
// import "fmt"
//
//	func main(){
//		//使用select并行打印
//		channInt:=make(chan int,10)
//		channString:=make(chan string,10)
//		for i:=1;i<=10;i++{
//			channInt<-i
//		}
//		for i:=1;i<=10;i++{
//			channString<-fmt.Sprintf("hello-%d",i)
//		}
//    //使用select使用前不需要close channel关闭反而有问题
//		for{
//			flag:=true
//			select{
//			case v:=<-channInt:
//				fmt.Printf("get a int %d from channInt\n",v)
//			case v:=<-channString:
//				fmt.Printf("get a string %s from channString\n",v)
//			default:
//				fmt.Printf("没有数据了\n")
//				flag=false
//			}
//			if flag==false{
//				break
//			}
//		}
//		fmt.Println("程序结束")
//	}
package main

import (
	"fmt"
	"sync"
	"time"
)
func sayHello(){
	defer wg.Done()
	for i:=1;i<=10;i++{
		time.Sleep(time.Millisecond*50)
		fmt.Printf("hello world\n")
	}
}
func test(){
	defer wg.Done()
	defer func(){
		if err:=recover();err!=nil{
			fmt.Printf("test error,err=%v\n",err)
		}
	}()
	time.Sleep(time.Millisecond*100)
	var map1 map[string]string
	map1["name"]="zhangsan"
}
var wg sync.WaitGroup
func main(){
	wg.Add(1)
	go sayHello()
	wg.Add(1)
	go test()
	wg.Wait()
	fmt.Printf("程序结束\n")

}